☆(≧∀≦*)ノ
嗨,我是wec,今天是DAY 30,最後一天嚕!
給定一個字符串表示的數學表達式,包含非負整數和 +, -, *, / 四種基本運算符,要求計算出它的結果。假設表達式是合法的,且不會有空格以外的其他字符。操作符之間可以有空格。
第1步: 使用一個堆疊來儲存數字和計算結果,然後建立一個變數num
來存儲當前解析的數字,和一個sign
來追蹤當前操作符(默認為+)。
第2步: 遍歷每個字符,如果是數字,將它組合到num
中。
如果是操作符(或最後一個字符),基於當前的sign
處理運算:
num
壓入堆疊。-num
壓入堆疊。num
,然後壓入堆疊。num
,然後壓入堆疊。sign
為當前操作符,並重置num
。def calculate(s)
stack = []
num = 0
sign = '+'
s.chars.each_with_index do |char, i|
if char =~ /\d/
num = num * 10 + char.to_i
end
if (!char =~ /\d/ && char != ' ') || i == s.length - 1
case sign
when '+'
stack.push(num)
when '-'
stack.push(-num)
when '*'
stack.push(stack.pop * num)
when '/'
stack.push((stack.pop.to_f / num).to_i)
end
sign = char
num = 0
end
end
stack.sum
end
堆疊: O(n),n為輸入字符串的長度。
➡️ 會挑選這題是因為數學有著先乘除後加減的特性,而堆疊就是很好解決的方法,我們用堆疊來暫存數字,當遇到乘法或除法時,再從堆疊頂部取出數字進行運算,最後將結果重新放回堆疊(加減法就直接將正負數放到堆疊裡就可以了!)。而使用num
跟sign
兩個變數則是可以避免頻繁的數字轉換跟操作符解析(´▽`)ノ !
那麽,以上就是最後一天的內容囉!
相信IT人動腦時都要吃點東西,所以今天邊寫邊吃無印良品的白巧克力草莓。
謝謝看到這裡的你,有機會再見嚕!掰掰〃•ω‹〃♡!!